From ed19394c8e11b6ba28352854d1276a8d95fac5dc Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 24 Oct 2004 05:48:16 +0000 Subject: [PATCH] Use the new g_key_file api in GLib. 2004-10-24 Matthias Clasen * gtk/gtkicontheme.c: Use the new g_key_file api in GLib. * gtk/Makefile.am (gtk_c_sources): Remove gtkiconthemeparser.[hc] * gtk/gtkiconthemeparser.[hc]: Removed. --- ChangeLog | 8 +- ChangeLog.pre-2-10 | 8 +- ChangeLog.pre-2-6 | 8 +- ChangeLog.pre-2-8 | 8 +- gtk/Makefile.am | 2 - gtk/gtkicontheme.c | 267 ++++++------ gtk/gtkiconthemeparser.c | 863 --------------------------------------- gtk/gtkiconthemeparser.h | 86 ---- 8 files changed, 159 insertions(+), 1091 deletions(-) delete mode 100644 gtk/gtkiconthemeparser.c delete mode 100644 gtk/gtkiconthemeparser.h diff --git a/ChangeLog b/ChangeLog index d956b41715..73774f6f0d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2004-10-24 Matthias Clasen + * gtk/gtkicontheme.c: Use the new g_key_file api in GLib. + + * gtk/Makefile.am (gtk_c_sources): Remove gtkiconthemeparser.[hc] + + * gtk/gtkiconthemeparser.[hc]: Removed. + * gtk/gtkfilechooserdefault.c (location_popup_handler): If the location dialog is brought up by typing '/', insert the slash in the entry. (#155370, Warren Togami) @@ -17,7 +23,7 @@ Billy Biggs) Sat Oct 23 16:14:37 2004 Søren Sandmann - +tkIconThemeFile * gtk/gtksequence.c (_gtk_sequence_node_insert_sorted): Remove assertion that can get triggered by broken sort functions. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index d956b41715..73774f6f0d 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,5 +1,11 @@ 2004-10-24 Matthias Clasen + * gtk/gtkicontheme.c: Use the new g_key_file api in GLib. + + * gtk/Makefile.am (gtk_c_sources): Remove gtkiconthemeparser.[hc] + + * gtk/gtkiconthemeparser.[hc]: Removed. + * gtk/gtkfilechooserdefault.c (location_popup_handler): If the location dialog is brought up by typing '/', insert the slash in the entry. (#155370, Warren Togami) @@ -17,7 +23,7 @@ Billy Biggs) Sat Oct 23 16:14:37 2004 Søren Sandmann - +tkIconThemeFile * gtk/gtksequence.c (_gtk_sequence_node_insert_sorted): Remove assertion that can get triggered by broken sort functions. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index d956b41715..73774f6f0d 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,5 +1,11 @@ 2004-10-24 Matthias Clasen + * gtk/gtkicontheme.c: Use the new g_key_file api in GLib. + + * gtk/Makefile.am (gtk_c_sources): Remove gtkiconthemeparser.[hc] + + * gtk/gtkiconthemeparser.[hc]: Removed. + * gtk/gtkfilechooserdefault.c (location_popup_handler): If the location dialog is brought up by typing '/', insert the slash in the entry. (#155370, Warren Togami) @@ -17,7 +23,7 @@ Billy Biggs) Sat Oct 23 16:14:37 2004 Søren Sandmann - +tkIconThemeFile * gtk/gtksequence.c (_gtk_sequence_node_insert_sorted): Remove assertion that can get triggered by broken sort functions. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index d956b41715..73774f6f0d 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,5 +1,11 @@ 2004-10-24 Matthias Clasen + * gtk/gtkicontheme.c: Use the new g_key_file api in GLib. + + * gtk/Makefile.am (gtk_c_sources): Remove gtkiconthemeparser.[hc] + + * gtk/gtkiconthemeparser.[hc]: Removed. + * gtk/gtkfilechooserdefault.c (location_popup_handler): If the location dialog is brought up by typing '/', insert the slash in the entry. (#155370, Warren Togami) @@ -17,7 +23,7 @@ Billy Biggs) Sat Oct 23 16:14:37 2004 Søren Sandmann - +tkIconThemeFile * gtk/gtksequence.c (_gtk_sequence_node_insert_sorted): Remove assertion that can get triggered by broken sort functions. diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 8dcbc343f8..3d93dae787 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -396,8 +396,6 @@ gtk_c_sources = \ gtkiconfactory.c \ gtkiconcache.c \ gtkicontheme.c \ - gtkiconthemeparser.c \ - gtkiconthemeparser.h \ gtkiconview.c \ gtkimage.c \ gtkimagemenuitem.c \ diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c index 1b9e9a6998..0336fd9440 100644 --- a/gtk/gtkicontheme.c +++ b/gtk/gtkicontheme.c @@ -36,7 +36,6 @@ #endif /* G_OS_WIN32 */ #include "gtkicontheme.h" -#include "gtkiconthemeparser.h" #include "gtkiconcache.h" #include "gtkintl.h" #include "gtksettings.h" @@ -208,7 +207,7 @@ static void theme_list_icons (IconTheme *theme, GQuark context); static void theme_subdir_load (GtkIconTheme *icon_theme, IconTheme *theme, - GtkIconThemeFile *theme_file, + GKeyFile *theme_file, char *subdir); static void do_theme_change (GtkIconTheme *icon_theme); @@ -863,10 +862,8 @@ insert_theme (GtkIconTheme *icon_theme, const char *theme_name) GtkIconThemePrivate *priv; IconTheme *theme; char *path; - char *contents; - char *directories; - char *inherits; - GtkIconThemeFile *theme_file; + GKeyFile *theme_file; + GError *error = NULL; IconThemeDirMtime *dir_mtime; struct stat stat_buf; @@ -895,20 +892,25 @@ insert_theme (GtkIconTheme *icon_theme, const char *theme_name) } theme_file = NULL; - for (i = 0; i < priv->search_path_len; i++) + for (i = 0; i < priv->search_path_len && !theme_file; i++) { path = g_build_filename (priv->search_path[i], theme_name, "index.theme", NULL); - if (g_file_test (path, G_FILE_TEST_IS_REGULAR)) { - if (g_file_get_contents (path, &contents, NULL, NULL)) { - theme_file = _gtk_icon_theme_file_new_from_string (contents, NULL); - g_free (contents); - g_free (path); - break; + if (g_file_test (path, G_FILE_TEST_IS_REGULAR)) + { + theme_file = g_key_file_new (); + g_key_file_set_list_separator (theme_file, ','); + g_key_file_load_from_file (theme_file, path, 0, &error); + if (error) + { + g_key_file_free (theme_file); + theme_file = NULL; + g_error_free (error); + error = NULL; + } } - } g_free (path); } @@ -916,71 +918,62 @@ insert_theme (GtkIconTheme *icon_theme, const char *theme_name) return; theme = g_new (IconTheme, 1); - if (!_gtk_icon_theme_file_get_locale_string (theme_file, - "Icon Theme", - "Name", - &theme->display_name)) + theme->display_name = + g_key_file_get_locale_string (theme_file, "Icon Theme", "Name", NULL, NULL); + if (!theme->display_name) { g_warning ("Theme file for %s has no name\n", theme_name); g_free (theme); - _gtk_icon_theme_file_free (theme_file); + g_key_file_free (theme_file); return; } - if (!_gtk_icon_theme_file_get_string (theme_file, - "Icon Theme", - "Directories", - &directories)) + dirs = g_key_file_get_string_list (theme_file, "Icon Theme", "Directories", NULL, NULL); + if (!dirs) { g_warning ("Theme file for %s has no directories\n", theme_name); g_free (theme->display_name); g_free (theme); - _gtk_icon_theme_file_free (theme_file); + g_key_file_free (theme_file); return; } theme->name = g_strdup (theme_name); - _gtk_icon_theme_file_get_locale_string (theme_file, - "Icon Theme", - "Comment", - &theme->comment); - _gtk_icon_theme_file_get_string (theme_file, - "Icon Theme", - "Example", - &theme->example); - - dirs = g_strsplit (directories, ",", 0); + theme->comment = + g_key_file_get_locale_string (theme_file, + "Icon Theme", "Comment", + NULL, NULL); + theme->example = + g_key_file_get_string (theme_file, + "Icon Theme", "Example", + NULL); theme->icon_caches = NULL; theme->dirs = NULL; for (i = 0; dirs[i] != NULL; i++) - theme_subdir_load (icon_theme, theme, theme_file, dirs[i]); + theme_subdir_load (icon_theme, theme, theme_file, dirs[i]); g_strfreev (dirs); theme->dirs = g_list_reverse (theme->dirs); - g_free (directories); - /* Prepend the finished theme */ priv->themes = g_list_prepend (priv->themes, theme); - if (_gtk_icon_theme_file_get_string (theme_file, + themes = g_key_file_get_string_list (theme_file, "Icon Theme", "Inherits", - &inherits)) + NULL, + NULL); + if (themes) { - themes = g_strsplit (inherits, ",", 0); - for (i = 0; themes[i] != NULL; i++) insert_theme (icon_theme, themes[i]); g_strfreev (themes); - - g_free (inherits); } - _gtk_icon_theme_file_free (theme_file); + g_key_file_free (theme_file); } static void @@ -1950,94 +1943,84 @@ theme_list_icons (IconTheme *theme, GHashTable *icons, static void load_icon_data (IconThemeDir *dir, const char *path, const char *name) { - GtkIconThemeFile *icon_file; + GKeyFile *icon_file; char *base_name; char **split; - char *contents; + gsize length; char *dot; char *str; char *split_point; int i; + gint *ivalues; + GError *error = NULL; GtkIconData *data; - if (g_file_get_contents (path, &contents, NULL, NULL)) + icon_file = g_key_file_new (); + g_key_file_set_list_separator (icon_file, ','); + g_key_file_load_from_file (icon_file, path, 0, &error); + if (error) { - icon_file = _gtk_icon_theme_file_new_from_string (contents, NULL); + g_error_free (error); + return; + } + else + { + base_name = g_strdup (name); + dot = strrchr (base_name, '.'); + *dot = 0; + + data = g_new0 (GtkIconData, 1); + g_hash_table_replace (dir->icon_data, base_name, data); - if (icon_file) + ivalues = g_key_file_get_integer_list (icon_file, + "Icon Data", "EmbeddedTextRectangle", + &length, NULL); + if (ivalues) { - base_name = g_strdup (name); - dot = strrchr (base_name, '.'); - *dot = 0; - - data = g_new0 (GtkIconData, 1); - g_hash_table_replace (dir->icon_data, base_name, data); - - if (_gtk_icon_theme_file_get_string (icon_file, "Icon Data", - "EmbeddedTextRectangle", - &str)) + if (length == 4) { - split = g_strsplit (str, ",", 4); - - i = 0; - while (split[i] != NULL) - i++; - - if (i==4) - { - data->has_embedded_rect = TRUE; - data->x0 = atoi (split[0]); - data->y0 = atoi (split[1]); - data->x1 = atoi (split[2]); - data->y1 = atoi (split[3]); - } - - g_strfreev (split); - g_free (str); + data->has_embedded_rect = TRUE; + data->x0 = ivalues[0]; + data->y0 = ivalues[1]; + data->x1 = ivalues[2]; + data->y1 = ivalues[3]; } + + g_free (ivalues); + } + + str = g_key_file_get_string (icon_file, "Icon Data", "AttachPoints", NULL); + if (str) + { + split = g_strsplit (str, "|", -1); + + data->n_attach_points = g_strv_length (split); + data->attach_points = g_malloc (sizeof (GdkPoint) * data->n_attach_points); - - if (_gtk_icon_theme_file_get_string (icon_file, "Icon Data", - "AttachPoints", - &str)) + i = 0; + while (split[i] != NULL && i < data->n_attach_points) { - split = g_strsplit (str, "|", -1); - - i = 0; - while (split[i] != NULL) - i++; - - data->n_attach_points = i; - data->attach_points = g_malloc (sizeof (GdkPoint) * i); - - i = 0; - while (split[i] != NULL && i < data->n_attach_points) + split_point = strchr (split[i], ','); + if (split_point) { - split_point = strchr (split[i], ','); - if (split_point) - { - *split_point = 0; - split_point++; - data->attach_points[i].x = atoi (split[i]); - data->attach_points[i].y = atoi (split_point); - } - i++; + *split_point = 0; + split_point++; + data->attach_points[i].x = atoi (split[i]); + data->attach_points[i].y = atoi (split_point); } - - g_strfreev (split); - g_free (str); + i++; } - _gtk_icon_theme_file_get_locale_string (icon_file, "Icon Data", - "DisplayName", - &data->display_name); - - _gtk_icon_theme_file_free (icon_file); + g_strfreev (split); + g_free (str); } - g_free (contents); + + data->display_name = g_key_file_get_locale_string (icon_file, + "Icon Data", "DisplayName", + NULL, NULL); + g_key_file_free (icon_file); } - } static void @@ -2095,9 +2078,9 @@ scan_directory (GtkIconThemePrivate *icon_theme, static void theme_subdir_load (GtkIconTheme *icon_theme, - IconTheme *theme, - GtkIconThemeFile *theme_file, - char *subdir) + IconTheme *theme, + GKeyFile *theme_file, + char *subdir) { int base; char *type_string; @@ -2110,18 +2093,20 @@ theme_subdir_load (GtkIconTheme *icon_theme, int max_size; int threshold; char *full_dir; + GError *error = NULL; - if (!_gtk_icon_theme_file_get_integer (theme_file, - subdir, - "Size", - &size)) + size = g_key_file_get_integer (theme_file, subdir, "Size", &error); + if (error) { - g_warning ("Theme directory %s of theme %s has no size field\n", subdir, theme->name); + g_error_free (error); + g_warning ("Theme directory %s of theme %s has no size field\n", + subdir, theme->name); return; } type = ICON_THEME_DIR_THRESHOLD; - if (_gtk_icon_theme_file_get_string (theme_file, subdir, "Type", &type_string)) + type_string = g_key_file_get_string (theme_file, subdir, "Type", NULL); + if (type_string) { if (strcmp (type_string, "Fixed") == 0) type = ICON_THEME_DIR_FIXED; @@ -2134,30 +2119,40 @@ theme_subdir_load (GtkIconTheme *icon_theme, } context = 0; - if (_gtk_icon_theme_file_get_string (theme_file, subdir, "Context", &context_string)) + context_string = g_key_file_get_string (theme_file, subdir, "Context", NULL); + if (context_string) { context = g_quark_from_string (context_string); g_free (context_string); } - if (!_gtk_icon_theme_file_get_integer (theme_file, - subdir, - "MaxSize", - &max_size)) - max_size = size; - - if (!_gtk_icon_theme_file_get_integer (theme_file, - subdir, - "MinSize", - &min_size)) - min_size = size; + max_size = g_key_file_get_integer (theme_file, subdir, "MaxSize", &error); + if (error) + { + max_size = size; + + g_error_free (error); + error = NULL; + } + + min_size = g_key_file_get_integer (theme_file, subdir, "MinSize", &error); + if (error) + { + min_size = size; + + g_error_free (error); + error = NULL; + } - if (!_gtk_icon_theme_file_get_integer (theme_file, - subdir, - "Threshold", - &threshold)) - threshold = 2; + threshold = g_key_file_get_integer (theme_file, subdir, "Threshold", &error); + if (error) + { + threshold = 2; + g_error_free (error); + error = NULL; + } + for (base = 0; base < icon_theme->priv->search_path_len; base++) { GtkIconCache *cache; diff --git a/gtk/gtkiconthemeparser.c b/gtk/gtkiconthemeparser.c deleted file mode 100644 index 0179253bab..0000000000 --- a/gtk/gtkiconthemeparser.c +++ /dev/null @@ -1,863 +0,0 @@ -/* GtkIconThemeParser - a parser of icon-theme files - * gtk-icon-theme-parser.c Copyright (C) 2002, 2003 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include - -#include -#include -#include - -#include "gtkalias.h" -#include "gtkiconthemeparser.h" - - - -typedef struct _GtkIconThemeFileSection GtkIconThemeFileSection; -typedef struct _GtkIconThemeFileLine GtkIconThemeFileLine; -typedef struct _GtkIconThemeFileParser GtkIconThemeFileParser; - -struct _GtkIconThemeFileSection { - GQuark section_name; /* 0 means just a comment block (before any section) */ - gint n_lines; - GtkIconThemeFileLine *lines; -}; - -struct _GtkIconThemeFileLine { - GQuark key; /* 0 means comment or blank line in value */ - char *locale; - gchar *value; -}; - -struct _GtkIconThemeFile { - gint n_sections; - GtkIconThemeFileSection *sections; - char *current_locale[2]; -}; - -struct _GtkIconThemeFileParser { - GtkIconThemeFile *df; - gint current_section; - gint n_allocated_lines; - gint n_allocated_sections; - gint line_nr; - char *line; -}; - -#define VALID_KEY_CHAR 1 -#define VALID_LOCALE_CHAR 2 -static const guchar valid[256] = { - 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , - 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , - 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x3 , 0x2 , 0x0 , - 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , - 0x0 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , - 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x0 , 0x0 , 0x0 , 0x0 , 0x2 , - 0x0 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , - 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x3 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , - 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , - 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , - 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , - 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , - 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , - 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , - 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , - 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , -}; - -static void report_error (GtkIconThemeFileParser *parser, - char *message, - GtkIconThemeFileParseError error_code, - GError **error); -static GtkIconThemeFileSection *lookup_section (GtkIconThemeFile *df, - const char *section); -static GtkIconThemeFileLine * lookup_line (GtkIconThemeFile *df, - GtkIconThemeFileSection *section, - const char *keyname, - const char *locale); - - -GQuark -_gtk_icon_theme_file_parse_error_quark (void) -{ - static GQuark quark; - if (!quark) - quark = g_quark_from_static_string ("g_desktop_parse_error"); - - return quark; -} - -static void -parser_free (GtkIconThemeFileParser *parser) -{ - _gtk_icon_theme_file_free (parser->df); -} - -static void -gtk_icon_theme_file_line_free (GtkIconThemeFileLine *line) -{ - g_free (line->locale); - g_free (line->value); -} - -static void -gtk_icon_theme_file_section_free (GtkIconThemeFileSection *section) -{ - int i; - - for (i = 0; i < section->n_lines; i++) - gtk_icon_theme_file_line_free (§ion->lines[i]); - - g_free (section->lines); -} - -void -_gtk_icon_theme_file_free (GtkIconThemeFile *df) -{ - int i; - - for (i = 0; i < df->n_sections; i++) - gtk_icon_theme_file_section_free (&df->sections[i]); - g_free (df->sections); - g_free (df->current_locale[0]); - g_free (df->current_locale[1]); - - g_free (df); -} - -static void -grow_lines (GtkIconThemeFileParser *parser) -{ - int new_n_lines; - GtkIconThemeFileSection *section; - - if (parser->n_allocated_lines == 0) - new_n_lines = 1; - else - new_n_lines = parser->n_allocated_lines*2; - - section = &parser->df->sections[parser->current_section]; - - section->lines = g_realloc (section->lines, - sizeof (GtkIconThemeFileLine) * new_n_lines); - parser->n_allocated_lines = new_n_lines; -} - -static void -grow_sections (GtkIconThemeFileParser *parser) -{ - int new_n_sections; - - if (parser->n_allocated_sections == 0) - new_n_sections = 1; - else - new_n_sections = parser->n_allocated_sections*2; - - parser->df->sections = g_renew (GtkIconThemeFileSection, - parser->df->sections, - new_n_sections); - parser->n_allocated_sections = new_n_sections; -} - -static gchar * -unescape_string (gchar *str, gint len) -{ - gchar *res; - gchar *p, *q; - gchar *end; - - /* len + 1 is enough, because unescaping never makes the - * string longer */ - res = g_new (gchar, len + 1); - p = str; - q = res; - end = str + len; - - while (p < end) - { - if (*p == 0) - { - /* Found an embedded null */ - g_free (res); - return NULL; - } - if (*p == '\\') - { - p++; - if (p >= end) - { - /* Escape at end of string */ - g_free (res); - return NULL; - } - - switch (*p) - { - case 's': - *q++ = ' '; - break; - case 't': - *q++ = '\t'; - break; - case 'n': - *q++ = '\n'; - break; - case 'r': - *q++ = '\r'; - break; - case '\\': - *q++ = '\\'; - break; - default: - /* Invalid escape code */ - g_free (res); - return NULL; - } - p++; - } - else - *q++ = *p++; - } - *q = 0; - - return res; -} - -static gchar * -escape_string (const gchar *str, gboolean escape_first_space) -{ - gchar *res; - char *q; - const gchar *p; - const gchar *end; - - /* len + 1 is enough, because unescaping never makes the - * string longer */ - res = g_new (gchar, strlen (str)*2 + 1); - - p = str; - q = res; - end = str + strlen (str); - - while (*p) - { - if (*p == ' ') - { - if (escape_first_space && p == str) - { - *q++ = '\\'; - *q++ = 's'; - } - else - *q++ = ' '; - } - else if (*p == '\\') - { - *q++ = '\\'; - *q++ = '\\'; - } - else if (*p == '\t') - { - *q++ = '\\'; - *q++ = 't'; - } - else if (*p == '\n') - { - *q++ = '\\'; - *q++ = 'n'; - } - else if (*p == '\r') - { - *q++ = '\\'; - *q++ = 'r'; - } - else - *q++ = *p; - p++; - } - *q = 0; - - return res; -} - - -static void -open_section (GtkIconThemeFileParser *parser, - const char *name) -{ - int n; - - if (parser->n_allocated_sections == parser->df->n_sections) - grow_sections (parser); - - if (parser->current_section == 0 && - parser->df->sections[0].section_name == 0 && - parser->df->sections[0].n_lines == 0) - { - if (!name) - g_warning ("non-initial NULL section\n"); - - /* The initial section was empty. Piggyback on it. */ - parser->df->sections[0].section_name = g_quark_from_string (name); - - return; - } - - n = parser->df->n_sections++; - - if (name) - parser->df->sections[n].section_name = g_quark_from_string (name); - else - parser->df->sections[n].section_name = 0; - parser->df->sections[n].n_lines = 0; - parser->df->sections[n].lines = NULL; - - parser->current_section = n; - parser->n_allocated_lines = 0; - grow_lines (parser); -} - -static GtkIconThemeFileLine * -new_line (GtkIconThemeFileParser *parser) -{ - GtkIconThemeFileSection *section; - GtkIconThemeFileLine *line; - - section = &parser->df->sections[parser->current_section]; - - if (parser->n_allocated_lines == section->n_lines) - grow_lines (parser); - - line = §ion->lines[section->n_lines++]; - - memset (line, 0, sizeof (GtkIconThemeFileLine)); - - return line; -} - -static gboolean -is_blank_line (GtkIconThemeFileParser *parser) -{ - gchar *p; - - p = parser->line; - - while (*p && *p != '\n') - { - if (!g_ascii_isspace (*p)) - return FALSE; - - p++; - } - return TRUE; -} - -static void -parse_comment_or_blank (GtkIconThemeFileParser *parser) -{ - GtkIconThemeFileLine *line; - gchar *line_end; - - line_end = strchr (parser->line, '\n'); - if (line_end == NULL) - line_end = parser->line + strlen (parser->line); - - line = new_line (parser); - - line->value = g_strndup (parser->line, line_end - parser->line); - - parser->line = (line_end) ? line_end + 1 : NULL; - parser->line_nr++; -} - -static gboolean -parse_section_start (GtkIconThemeFileParser *parser, GError **error) -{ - gchar *line_end; - gchar *section_name; - - line_end = strchr (parser->line, '\n'); - if (line_end == NULL) - line_end = parser->line + strlen (parser->line); - - if (line_end - parser->line <= 2 || - line_end[-1] != ']') - { - report_error (parser, "Invalid syntax for section header", GTK_ICON_THEME_FILE_PARSE_ERROR_INVALID_SYNTAX, error); - parser_free (parser); - return FALSE; - } - - section_name = unescape_string (parser->line + 1, line_end - parser->line - 2); - - if (section_name == NULL) - { - report_error (parser, "Invalid escaping in section name", GTK_ICON_THEME_FILE_PARSE_ERROR_INVALID_ESCAPES, error); - parser_free (parser); - return FALSE; - } - - open_section (parser, section_name); - - parser->line = (line_end) ? line_end + 1 : NULL; - parser->line_nr++; - - g_free (section_name); - - return TRUE; -} - -static gboolean -parse_key_value (GtkIconThemeFileParser *parser, GError **error) -{ - GtkIconThemeFileLine *line; - gchar *line_end; - gchar *key_start; - gchar *key_end; - gchar *key; - gchar *locale_start = NULL; - gchar *locale_end = NULL; - gchar *value_start; - gchar *value; - gchar *p; - - line_end = strchr (parser->line, '\n'); - if (line_end == NULL) - line_end = parser->line + strlen (parser->line); - - p = parser->line; - key_start = p; - while (p < line_end && - (valid[(guchar)*p] & VALID_KEY_CHAR)) - p++; - key_end = p; - - if (key_start == key_end) - { - report_error (parser, "Empty key name", GTK_ICON_THEME_FILE_PARSE_ERROR_INVALID_SYNTAX, error); - parser_free (parser); - return FALSE; - } - - if (p < line_end && *p == '[') - { - p++; - locale_start = p; - while (p < line_end && *p != ']') - p++; - locale_end = p; - - if (p == line_end) - { - report_error (parser, "Unterminated locale specification in key", GTK_ICON_THEME_FILE_PARSE_ERROR_INVALID_SYNTAX, error); - parser_free (parser); - return FALSE; - } - - p++; - } - - /* Skip space before '=' */ - while (p < line_end && *p == ' ') - p++; - - if (p < line_end && *p != '=') - { - report_error (parser, "Invalid characters in key name", GTK_ICON_THEME_FILE_PARSE_ERROR_INVALID_CHARS, error); - parser_free (parser); - return FALSE; - } - - if (p == line_end) - { - report_error (parser, "No '=' in key/value pair", GTK_ICON_THEME_FILE_PARSE_ERROR_INVALID_SYNTAX, error); - parser_free (parser); - return FALSE; - } - - /* Skip the '=' */ - p++; - - /* Skip space after '=' */ - while (p < line_end && *p == ' ') - p++; - - value_start = p; - - value = unescape_string (value_start, line_end - value_start); - if (value == NULL) - { - report_error (parser, "Invalid escaping in value", GTK_ICON_THEME_FILE_PARSE_ERROR_INVALID_ESCAPES, error); - parser_free (parser); - return FALSE; - } - - line = new_line (parser); - key = g_strndup (key_start, key_end - key_start); - line->key = g_quark_from_string (key); - g_free (key); - if (locale_start) - line->locale = g_strndup (locale_start, locale_end - locale_start); - line->value = value; - - parser->line = (line_end) ? line_end + 1 : NULL; - parser->line_nr++; - - return TRUE; -} - - -static void -report_error (GtkIconThemeFileParser *parser, - char *message, - GtkIconThemeFileParseError error_code, - GError **error) -{ - GtkIconThemeFileSection *section; - const gchar *section_name = NULL; - - section = &parser->df->sections[parser->current_section]; - - if (section->section_name) - section_name = g_quark_to_string (section->section_name); - - if (error) - { - if (section_name) - *error = g_error_new (GTK_ICON_THEME_FILE_PARSE_ERROR, - error_code, - "Error in section %s at line %d: %s", section_name, parser->line_nr, message); - else - *error = g_error_new (GTK_ICON_THEME_FILE_PARSE_ERROR, - error_code, - "Error at line %d: %s", parser->line_nr, message); - } -} - - -GtkIconThemeFile * -_gtk_icon_theme_file_new_from_string (char *data, - GError **error) -{ - GtkIconThemeFileParser parser; - - parser.df = g_new0 (GtkIconThemeFile, 1); - parser.current_section = -1; - - parser.n_allocated_lines = 0; - parser.n_allocated_sections = 0; - parser.line_nr = 1; - - parser.line = data; - - /* Put any initial comments in a NULL segment */ - open_section (&parser, NULL); - - while (parser.line && *parser.line) - { - if (*parser.line == '[') { - if (!parse_section_start (&parser, error)) - return NULL; - } else if (is_blank_line (&parser) || - *parser.line == '#') - parse_comment_or_blank (&parser); - else - { - if (!parse_key_value (&parser, error)) - return NULL; - } - } - - return parser.df; -} - -char * -_gtk_icon_theme_file_to_string (GtkIconThemeFile *df) -{ - GtkIconThemeFileSection *section; - GtkIconThemeFileLine *line; - GString *str; - char *s; - int i, j; - - str = g_string_sized_new (800); - - for (i = 0; i < df->n_sections; i ++) - { - section = &df->sections[i]; - - if (section->section_name) - { - g_string_append_c (str, '['); - s = escape_string (g_quark_to_string (section->section_name), FALSE); - g_string_append (str, s); - g_free (s); - g_string_append (str, "]\n"); - } - - for (j = 0; j < section->n_lines; j++) - { - line = §ion->lines[j]; - - if (line->key == 0) - { - g_string_append (str, line->value); - g_string_append_c (str, '\n'); - } - else - { - g_string_append (str, g_quark_to_string (line->key)); - if (line->locale) - { - g_string_append_c (str, '['); - g_string_append (str, line->locale); - g_string_append_c (str, ']'); - } - g_string_append_c (str, '='); - s = escape_string (line->value, TRUE); - g_string_append (str, s); - g_free (s); - g_string_append_c (str, '\n'); - } - } - } - - return g_string_free (str, FALSE); -} - -static GtkIconThemeFileSection * -lookup_section (GtkIconThemeFile *df, - const char *section_name) -{ - GtkIconThemeFileSection *section; - GQuark section_quark; - int i; - - section_quark = g_quark_try_string (section_name); - if (section_quark == 0) - return NULL; - - for (i = 0; i < df->n_sections; i ++) - { - section = &df->sections[i]; - - if (section->section_name == section_quark) - return section; - } - return NULL; -} - -static GtkIconThemeFileLine * -lookup_line (GtkIconThemeFile *df, - GtkIconThemeFileSection *section, - const char *keyname, - const char *locale) -{ - GtkIconThemeFileLine *line; - GQuark key_quark; - int i; - - key_quark = g_quark_try_string (keyname); - if (key_quark == 0) - return NULL; - - for (i = 0; i < section->n_lines; i++) - { - line = §ion->lines[i]; - - if (line->key == key_quark && - ((locale == NULL && line->locale == NULL) || - (locale != NULL && line->locale != NULL && strcmp (locale, line->locale) == 0))) - return line; - } - - return NULL; -} - -gboolean -_gtk_icon_theme_file_get_raw (GtkIconThemeFile *df, - const char *section_name, - const char *keyname, - const char *locale, - char **val) -{ - GtkIconThemeFileSection *section; - GtkIconThemeFileLine *line; - - *val = NULL; - - section = lookup_section (df, section_name); - if (!section) - return FALSE; - - line = lookup_line (df, - section, - keyname, - locale); - - if (!line) - return FALSE; - - *val = g_strdup (line->value); - - return TRUE; -} - - -void -_gtk_icon_theme_file_foreach_section (GtkIconThemeFile *df, - GtkIconThemeFileSectionFunc func, - gpointer user_data) -{ - GtkIconThemeFileSection *section; - int i; - - for (i = 0; i < df->n_sections; i ++) - { - section = &df->sections[i]; - - (*func) (df, g_quark_to_string (section->section_name), user_data); - } - return; -} - -void -_gtk_icon_theme_file_foreach_key (GtkIconThemeFile *df, - const char *section_name, - gboolean include_localized, - GtkIconThemeFileLineFunc func, - gpointer user_data) -{ - GtkIconThemeFileSection *section; - GtkIconThemeFileLine *line; - int i; - - section = lookup_section (df, section_name); - if (!section) - return; - - for (i = 0; i < section->n_lines; i++) - { - line = §ion->lines[i]; - - (*func) (df, g_quark_to_string (line->key), line->locale, line->value, user_data); - } - - return; -} - - -static void -calculate_locale (GtkIconThemeFile *df) -{ - char *p, *lang; - -#ifdef HAVE_LC_MESSAGES - lang = g_strdup (setlocale (LC_MESSAGES, NULL)); -#else - lang = g_strdup (setlocale (LC_CTYPE, NULL)); -#endif - - if (lang) - { - p = strchr (lang, '.'); - if (p) - *p = '\0'; - p = strchr (lang, '@'); - if (p) - *p = '\0'; - } - else - lang = g_strdup ("C"); - - p = strchr (lang, '_'); - if (p) - { - df->current_locale[0] = g_strdup (lang); - *p = '\0'; - df->current_locale[1] = lang; - } - else - { - df->current_locale[0] = lang; - df->current_locale[1] = NULL; - } -} - -gboolean -_gtk_icon_theme_file_get_locale_string (GtkIconThemeFile *df, - const char *section, - const char *keyname, - char **val) -{ - gboolean res; - - if (df->current_locale[0] == NULL) - calculate_locale (df); - - if (df->current_locale[0] != NULL) - { - res = _gtk_icon_theme_file_get_raw (df,section, keyname, - df->current_locale[0], val); - if (res) - return TRUE; - } - - if (df->current_locale[1] != NULL) - { - res = _gtk_icon_theme_file_get_raw (df,section, keyname, - df->current_locale[1], val); - if (res) - return TRUE; - } - - return _gtk_icon_theme_file_get_raw (df, section, keyname, NULL, val); -} - -gboolean -_gtk_icon_theme_file_get_string (GtkIconThemeFile *df, - const char *section, - const char *keyname, - char **val) -{ - return _gtk_icon_theme_file_get_raw (df, section, keyname, NULL, val); -} - -gboolean -_gtk_icon_theme_file_get_integer (GtkIconThemeFile *df, - const char *section, - const char *keyname, - int *val) -{ - gboolean res; - char *str; - - *val = 0; - - res = _gtk_icon_theme_file_get_raw (df, section, keyname, NULL, &str); - if (!res) - return FALSE; - - - *val = atoi (str); - g_free (str); - - return TRUE; - -} - diff --git a/gtk/gtkiconthemeparser.h b/gtk/gtkiconthemeparser.h deleted file mode 100644 index aa4bd91742..0000000000 --- a/gtk/gtkiconthemeparser.h +++ /dev/null @@ -1,86 +0,0 @@ -/* GtkIconThemeParser - a parser of icon-theme files - * gtkiconthemeparser.h Copyright (C) 2002, 2003 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GTK_ICON_THEME_PARSER_H__ -#define __GTK_ICON_THEME_PARSER_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GtkIconThemeFile GtkIconThemeFile; - -typedef void (* GtkIconThemeFileSectionFunc) (GtkIconThemeFile *df, - const char *name, - gpointer data); - -/* If @key is %NULL, @value is a comment line. */ -/* @value is raw, unescaped data. */ -typedef void (* GtkIconThemeFileLineFunc) (GtkIconThemeFile *df, - const char *key, - const char *locale, - const char *value, - gpointer data); - -typedef enum -{ - GTK_ICON_THEME_FILE_PARSE_ERROR_INVALID_SYNTAX, - GTK_ICON_THEME_FILE_PARSE_ERROR_INVALID_ESCAPES, - GTK_ICON_THEME_FILE_PARSE_ERROR_INVALID_CHARS -} GtkIconThemeFileParseError; - -#define GTK_ICON_THEME_FILE_PARSE_ERROR _gtk_icon_theme_file_parse_error_quark() -GQuark _gtk_icon_theme_file_parse_error_quark (void); - -GtkIconThemeFile *_gtk_icon_theme_file_new_from_string (char *data, - GError **error); -char * _gtk_icon_theme_file_to_string (GtkIconThemeFile *df); -void _gtk_icon_theme_file_free (GtkIconThemeFile *df); - -void _gtk_icon_theme_file_foreach_section (GtkIconThemeFile *df, - GtkIconThemeFileSectionFunc func, - gpointer user_data); -void _gtk_icon_theme_file_foreach_key (GtkIconThemeFile *df, - const char *section, - gboolean include_localized, - GtkIconThemeFileLineFunc func, - gpointer user_data); - -/* Gets the raw text of the key, unescaped */ -gboolean _gtk_icon_theme_file_get_raw (GtkIconThemeFile *df, - const char *section, - const char *keyname, - const char *locale, - char **val); -gboolean _gtk_icon_theme_file_get_integer (GtkIconThemeFile *df, - const char *section, - const char *keyname, - int *val); -gboolean _gtk_icon_theme_file_get_string (GtkIconThemeFile *df, - const char *section, - const char *keyname, - char **val); -gboolean _gtk_icon_theme_file_get_locale_string (GtkIconThemeFile *df, - const char *section, - const char *keyname, - char **val); - -G_END_DECLS - -#endif /* GTK_ICON_THEME_PARSER_H */ -- 2.30.2